package referencetest;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

public class ReferenceTest {
    public static void main(String[] args) {
        softReferenceTest();
        weakReferenceTest();
        phantomReferenceTest();
    }

    public static void softReferenceTest() {
        //创建一个字符串对象
        String str = new String("软引用测试");
        //创建一个软引用，让此弱应用引用到“软引用测试”
        SoftReference sr = new SoftReference(str);
        //切断str和“软引用测试”之间的引用
        str = null;
        //取出软引用引用的对象
        System.out.println(sr.get());
        //强制垃圾回收
        System.gc();
        System.runFinalization();
        //再次取出软引用引用的对象
        System.out.println(sr.get());
    }


    public static void weakReferenceTest() {
        //创建一个字符串对象
        String str = new String("弱引用测试");
        //创建一个弱引用，让此弱应用引用到“弱引用测试”
        WeakReference wr = new WeakReference(str);
        //切断str和“弱引用测试”之间的引用
        str = null;
        //取出弱引用引用的对象
        System.out.println(wr.get());
        //强制垃圾回收
        System.gc();
        System.runFinalization();
        //再次取出弱引用引用的对象
        System.out.println(wr.get());
    }

    public static void phantomReferenceTest() {
        //创建一个字符串对象
        String str = new String("虚引用测试");
        //创建一个引用队列
        ReferenceQueue rq = new ReferenceQueue();
        //创建一个虚引用，让此弱应用引用到“虚引用测试”
        PhantomReference pr = new PhantomReference(str, rq);
        //切断str和“虚引用测试”之间的引用
        str = null;
        //取出虚引用引用的对象,并不能通过虚引用获取到被引用的对象，所以此处输出null
        System.out.println(pr.get());
        //强制垃圾回收
        System.gc();
        System.runFinalization();
        //
        System.out.println(rq.poll() == pr);
        System.out.println(rq.poll());
        System.out.println(pr);
    }
}
